home *** CD-ROM | disk | FTP | other *** search
- package koala.dynamicjava.interpreter.context;
-
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.Set;
- import koala.dynamicjava.classinfo.JavaClassInfo;
- import koala.dynamicjava.interpreter.Interpreter;
- import koala.dynamicjava.interpreter.InterpreterUtilities;
- import koala.dynamicjava.interpreter.NodeProperties;
- import koala.dynamicjava.interpreter.TreeCompiler;
- import koala.dynamicjava.interpreter.error.CatchedExceptionError;
- import koala.dynamicjava.interpreter.error.ExecutionError;
- import koala.dynamicjava.interpreter.throwable.ThrownException;
- import koala.dynamicjava.tree.ClassAllocation;
- import koala.dynamicjava.tree.ClassDeclaration;
- import koala.dynamicjava.tree.ConstructorDeclaration;
- import koala.dynamicjava.tree.ConstructorInvocation;
- import koala.dynamicjava.tree.Expression;
- import koala.dynamicjava.tree.FieldDeclaration;
- import koala.dynamicjava.tree.FormalParameter;
- import koala.dynamicjava.tree.Identifier;
- import koala.dynamicjava.tree.IdentifierToken;
- import koala.dynamicjava.tree.Node;
- import koala.dynamicjava.tree.ObjectFieldAccess;
- import koala.dynamicjava.tree.QualifiedName;
- import koala.dynamicjava.tree.ReferenceType;
- import koala.dynamicjava.tree.SimpleAllocation;
- import koala.dynamicjava.tree.SimpleAssignExpression;
- import koala.dynamicjava.tree.TreeUtilities;
- import koala.dynamicjava.tree.TypeDeclaration;
- import koala.dynamicjava.tree.TypeExpression;
- import koala.dynamicjava.util.ImportationManager;
- import koala.dynamicjava.util.ReflectionUtilities;
-
- public class MethodContext extends StaticContext {
- protected static final Identifier thisIdentifier = new Identifier("this");
- // $FF: synthetic field
- private static Class class$Ljava$util$Map;
-
- public Node getDefaultQualifier(Node var1, String var2) {
- if (var2.equals("")) {
- return this.defaultQualifier;
- } else {
- try {
- Class var3 = ((StaticContext)this).lookupClass(var2);
- Class var4 = this.declaringClass;
-
- for(Object var5 = this.defaultQualifier; var4 != null; var4 = InterpreterUtilities.getDeclaringClass(var4)) {
- if (var4 == var3) {
- return (Node)var5;
- }
-
- var5 = new ObjectFieldAccess((Expression)var5, this.getOuterThisName(var4));
- }
-
- throw new ExecutionError("this.expression", var1);
- } catch (ClassNotFoundException var6) {
- throw new CatchedExceptionError(var6, var1);
- }
- }
- }
-
- public Expression createName(Node var1, IdentifierToken var2) {
- if (((VariableContext)this).isDefinedVariable(var2.image())) {
- return super.createName(var1, var2);
- } else {
- Object var3 = null;
-
- try {
- Field var11 = ReflectionUtilities.getField(this.declaringClass, var2.image());
- return new ObjectFieldAccess((Expression)this.defaultQualifier, var2.image());
- } catch (Exception var9) {
- try {
- Field var10 = InterpreterUtilities.getOuterField(this.declaringClass, var2.image());
- Object var5 = (Expression)this.defaultQualifier;
- Class var6 = this.declaringClass;
-
- for(Class var7 = var10.getDeclaringClass(); !var7.isAssignableFrom(var6); var6 = InterpreterUtilities.getDeclaringClass(var6)) {
- var5 = new ObjectFieldAccess((Expression)var5, this.getOuterThisName(var6));
- }
-
- return new ObjectFieldAccess((Expression)var5, var2.image());
- } catch (Exception var8) {
- throw new CatchedExceptionError(var9, var1);
- }
- }
- }
- }
-
- public Object getHiddenArgument() {
- return ((VariableContext)this).get("this");
- }
-
- public Class setProperties(SimpleAllocation var1, Class var2, Class[] var3) {
- Object var4 = null;
-
- try {
- var11 = ((GlobalContext)this).lookupConstructor(var2, var3);
- } catch (Exception var10) {
- if (this.isInnerclass(var2, this.declaringClass)) {
- Class[] var12 = new Class[var3.length + 1];
- var12[0] = this.declaringClass;
-
- for(int var13 = 1; var13 < var12.length; ++var13) {
- var12[var13] = var3[var13 - 1];
- }
-
- try {
- var11 = ((GlobalContext)this).lookupConstructor(var2, var12);
- } catch (Exception var9) {
- throw new CatchedExceptionError(var10, var1);
- }
-
- var1.setProperty("innerAllocation", (Object)null);
- } else {
- if (var2.getDeclaringClass() == null || var2.getDeclaringClass() != this.declaringClass.getDeclaringClass()) {
- throw new CatchedExceptionError(var10, var1);
- }
-
- Class[] var6 = new Class[var3.length + 1];
- var6[0] = this.declaringClass.getDeclaringClass();
-
- for(int var7 = 1; var7 < var6.length; ++var7) {
- var6[var7] = var3[var7 - 1];
- }
-
- try {
- var11 = ((GlobalContext)this).lookupConstructor(var2, var6);
- } catch (Exception var8) {
- throw new CatchedExceptionError(var10, var1);
- }
-
- var1.setProperty("outerInnerAllocation", (Object)null);
- }
- }
-
- var1.setProperty("type", var2);
- var1.setProperty("constructor", var11);
- return var2;
- }
-
- public Object invokeConstructor(SimpleAllocation var1, Object[] var2) {
- Constructor var3 = (Constructor)var1.getProperty("constructor");
- if (var1.hasProperty("innerAllocation")) {
- Object[] var4 = new Object[var2.length + 1];
- var4[0] = this.getHiddenArgument();
-
- for(int var5 = 1; var5 < var4.length; ++var5) {
- var4[var5] = var2[var5 - 1];
- }
-
- var2 = var4;
- } else if (var1.hasProperty("outerInnerAllocation")) {
- Object[] var11 = new Object[var2.length + 1];
- Field[] var12 = this.declaringClass.getDeclaredFields();
-
- for(int var6 = 0; var6 < var12.length; ++var6) {
- if (var12[var6].getName().startsWith("this$")) {
- try {
- var12[var6].setAccessible(true);
- var11[0] = var12[var6].get(this.getHiddenArgument());
- break;
- } catch (IllegalAccessException var8) {
- throw new CatchedExceptionError(var8, var1);
- }
- }
- }
-
- for(int var13 = 1; var13 < var11.length; ++var13) {
- var11[var13] = var2[var13 - 1];
- }
-
- var2 = var11;
- }
-
- try {
- return var3.newInstance(var2);
- } catch (InvocationTargetException var9) {
- if (var9.getTargetException() instanceof Error) {
- throw (Error)var9.getTargetException();
- } else {
- throw new ThrownException(var9.getTargetException());
- }
- } catch (Exception var10) {
- throw new CatchedExceptionError(var10, var1);
- }
- }
-
- public Class setProperties(ClassAllocation var1, Class var2, Class[] var3, List var4) {
- String var5 = this.declaringClass.getName();
- String var6 = var5 + "$" + classCount++;
- ReferenceType var9 = new ReferenceType(var5);
- FieldDeclaration var7 = new FieldDeclaration(25, CLASS_TYPE, "declaring$Class$Reference$0", new TypeExpression(var9));
- var4.add(var7);
- var7 = new FieldDeclaration(1, var9, "this$0", (Expression)null);
- var4.add(var7);
- var4.add(LOCALS);
- var7 = new FieldDeclaration(25, OBJECT_ARRAY_ARRAY, "local$Variables$Class$0", ((GlobalContext)this).createClassArrayInitializer());
- var4.add(var7);
- LinkedList var10 = new LinkedList();
- LinkedList var11 = new LinkedList();
- var10.add(new FormalParameter(false, var9, "param$0"));
- var10.add(new FormalParameter(false, MAP_TYPE, "param$1"));
- LinkedList var12 = new LinkedList();
-
- for(int var13 = 0; var13 < var3.length; ++var13) {
- var10.add(new FormalParameter(false, TreeUtilities.classToType(var3[var13]), "param$" + (var13 + 2)));
- LinkedList var14 = new LinkedList();
- var14.add(new Identifier("param$" + (var13 + 2)));
- var12.add(new QualifiedName(var14));
- }
-
- ConstructorInvocation var26 = null;
- if (var12.size() > 0) {
- var26 = new ConstructorInvocation((Expression)null, var12, true);
- }
-
- LinkedList var27 = new LinkedList();
- var27.add(new Identifier("this$0"));
- LinkedList var15 = new LinkedList();
- var15.add(new Identifier("param$0"));
- var11.add(new SimpleAssignExpression(new QualifiedName(var27), new QualifiedName(var15)));
- var27 = new LinkedList();
- var27.add(new Identifier("local$Variables$Reference$0"));
- var15 = new LinkedList();
- var15.add(new Identifier("param$1"));
- var11.add(new SimpleAssignExpression(new QualifiedName(var27), new QualifiedName(var15)));
- ConstructorDeclaration var8 = new ConstructorDeclaration(1, var6, var10, new LinkedList(), var26, var11);
- var4.add(var8);
- LinkedList var16 = null;
- LinkedList var17 = null;
- if (var2.isInterface()) {
- var17 = new LinkedList();
- LinkedList var18 = new LinkedList();
- var18.add(new Identifier(var2.getName()));
- var17.add(var18);
- } else {
- var16 = new LinkedList();
- var16.add(new Identifier(var2.getName()));
- }
-
- ClassDeclaration var30 = new ClassDeclaration(1, var6, var16, var17, var4);
- ((TypeDeclaration)var30).setProperty("anonymousDeclaringClass", new JavaClassInfo(this.declaringClass));
- Class var19 = (new TreeCompiler(this.interpreter)).compileTree(this, var30);
- Class[] var20 = new Class[var3.length + 2];
- var20[0] = this.declaringClass;
- var20[1] = class$Ljava$util$Map != null ? class$Ljava$util$Map : (class$Ljava$util$Map = class$("java.util.Map"));
-
- for(int var21 = 2; var21 < var20.length; ++var21) {
- var20[var21] = var3[var21 - 2];
- }
-
- var3 = var20;
-
- try {
- var1.setProperty("constructor", ((GlobalContext)this).lookupConstructor(var19, var3));
- } catch (NoSuchMethodException var22) {
- var22.printStackTrace();
- }
-
- var1.setProperty("type", var19);
- return var19;
- }
-
- public Object invokeConstructor(ClassAllocation var1, Object[] var2) {
- Constructor var3 = (Constructor)var1.getProperty("constructor");
- Object[] var4 = new Object[var2.length + 2];
- var4[0] = this.getHiddenArgument();
- var4[1] = ((VariableContext)this).getConstants();
-
- for(int var5 = 2; var5 < var4.length; ++var5) {
- var4[var5] = var2[var5 - 2];
- }
-
- var2 = var4;
-
- try {
- return var3.newInstance(var2);
- } catch (InvocationTargetException var6) {
- if (var6.getTargetException() instanceof Error) {
- throw (Error)var6.getTargetException();
- } else {
- throw new ThrownException(var6.getTargetException());
- }
- } catch (Exception var7) {
- throw new CatchedExceptionError(var7, var1);
- }
- }
-
- public Method lookupMethod(Node var1, String var2, Class[] var3) throws NoSuchMethodException {
- Class var4 = NodeProperties.getType(var1);
- Object var5 = null;
-
- try {
- Method var12 = ReflectionUtilities.lookupMethod(var4, var2, var3);
- ((StaticContext)this).setAccessFlag(var12);
- if (var12.getName().equals("clone")) {
- var12.setAccessible(true);
- }
-
- return var12;
- } catch (NoSuchMethodException var10) {
- if (var1 instanceof QualifiedName && ((QualifiedName)var1).getRepresentation().equals("this")) {
- Method var11 = InterpreterUtilities.lookupOuterMethod(var4, var2, var3);
- Object var7 = (Expression)this.defaultQualifier;
-
- for(Class var8 = this.declaringClass; var8 != var11.getDeclaringClass(); var8 = InterpreterUtilities.getDeclaringClass(var8)) {
- String var9 = this.getOuterThisName(var8);
- if (var9 == null) {
- break;
- }
-
- var7 = new ObjectFieldAccess((Expression)var7, this.getOuterThisName(var8));
- }
-
- var11.setAccessible(true);
- throw new MethodModificationError((Expression)var7, var11);
- } else {
- throw var10;
- }
- }
- }
-
- protected boolean isInnerclass(Class var1, Class var2) {
- do {
- Class[] var3 = var2.getDeclaredClasses();
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- if (var3[var4] == var1) {
- return true;
- }
- }
- } while((var2 = var2.getSuperclass()) != null);
-
- return false;
- }
-
- protected String getOuterThisName(Class var1) {
- Field[] var2 = var1.getDeclaredFields();
-
- for(int var3 = 0; var3 < var2.length; ++var3) {
- if (var2[var3].getName().startsWith("this$")) {
- return var2[var3].getName();
- }
- }
-
- return null;
- }
-
- // $FF: synthetic method
- static Class class$(String var0) {
- try {
- return Class.forName(var0);
- } catch (ClassNotFoundException var2) {
- throw new NoClassDefFoundError(((Throwable)var2).getMessage());
- }
- }
-
- public MethodContext(Interpreter var1, Class var2, Object var3, ImportationManager var4) {
- super(var1, var2, var4);
- this.importationManager = var4;
- LinkedList var5 = new LinkedList();
- var5.add(thisIdentifier);
- this.defaultQualifier = new QualifiedName(var5);
- ((VariableContext)this).setConstant("this", var3);
- }
-
- public MethodContext(Interpreter var1, Class var2, Object var3, Set var4) {
- super(var1, var2, var4);
- LinkedList var5 = new LinkedList();
- var5.add(thisIdentifier);
- this.defaultQualifier = new QualifiedName(var5);
- ((VariableContext)this).setConstant("this", var3);
- }
- }
-